package main

/*
数组是具有相同唯一类型的一组已经编号且长度固定的数据序列
数组的元素也是可以通过索引来读取或修改值，索引从0开始

var name [size] type

var lst [5]int
var lst = [5]int{1,2,3,4,5}

数组长度不确定，可以使用...代替数组的长度，编译器会根据元素的个数自行推断数组的长度
	lst := [...]int {1,23,4,53,34}
 */
func main() {
	//var arr [5]int
	//fmt.Print(arr[0])
	//arr = [5]int{1,2,3,4,5}
	//fmt.Println(arr[0])
	////arr2 := [2]int{6,7}
	////arr3 := arr + arr2 不支持赋值
	////lst := [5]int{1:200} //将下标为1的元素初始化为200
	//arr2 := arr[1:3]
	//fmt.Println(arr2)
	//arr3 := arr[1:4:4]  //通过索引截取的数据类型 不是数组，slice 切片
	//fmt.Println(arr3)
	//
	////遍历
	//for k,v :=range arr{
	//	fmt.Println(k,"--》",v)
	//}
	//
	//str_lst := [5]string{"abc","中文","123","456","888"}
	//
	//for i := 0; i<len(str_lst); i++ {
	//	fmt.Println(str_lst[i])
	//}
	//
	//a := [3][4] int{
	//	{1,2,3,4},
	//	{4,5,6,7},
	//	{7,8,9,10},
	//}
	//for _,i := range a{
	//	for _, j := range i{
	//		fmt.Println(j)
	//	}
	//}
	/*
	   go  数组长度固定不可改变，在特定的场景中这样的集合就不太实用

	   go中提供网络更加灵活的内置类型	切片 （“动态数组”）
	   与数组相比，切片的长度是不固定的，可以追加元素

	   var name [] type
	   使用make函数定义指定切片
	   #len 和cap 是可选
	   var name []type = make([]type,len,cap)
	   name := make([]type,len,cap)
	*/
	//
	//s1 := make([]int,5)
	//fmt.Printf("%p \n",s1)
	//fmt.Println("s1,长度为：", len(s1))
	//fmt.Println("s1,容量为：", cap(s1))
	////
	//s1 = append(s1, 6)
	//fmt.Println(s1)
	//
	//
	//s1 = append(s1, 7)
	//s1 = append(s1, 8)
	//s1 = append(s1, 9)
	//s1 = append(s1, 10)
	//s1 = append(s1, 11)
	//
	//fmt.Printf("%p \n",s1)
	//fmt.Println(len(s1))
	//fmt.Println(cap(s1))
	//
	//s1[10] = 100
	//fmt.Println(s1)
	/*
		切片 -- 引用类型  保存的是地址
		具体的值 给底层数组保存的

		容量：底层数组大小	-- cap()
		长度：切片使用大小  -- len()
	*/
	//从一个切片创建另一个切片 slice[start:end:容量]，容量需要超过或等于end的数量
	//mynum := []int{10, 20, 30, 40, 50}
	//mynum2 := mynum[0:3:5]
	//fmt.Println(mynum2)
	//fmt.Println(cap(mynum))
	//fmt.Println("容量为：",cap(mynum2))
	//fmt.Println("长度为：",len(mynum2))
	//fmt.Printf("%p \n",mynum)
	//fmt.Printf("%p \n",mynum2)
	//
	////copy()完全拷贝
	////mynum3 := make([]int,5)
	////copy(mynum3,mynum)
	////mynum3[3] = 900
	////fmt.Println(mynum3)
	////fmt.Println(mynum)
	////
	//////删除
	////mynum = mynum[1:]
	////删除中间
	//mynum = append(mynum[:2],mynum[3:]...)
	//fmt.Println("删除中间元素：", mynum)
	//
	////interface	接口类型
	////空接口可以代表任何类型对象，可以存放任何数据类型对象
	//lst1 := make([]interface{},5)
	//lst1[0] = "abc"
	//lst1[1] = 12
	//
	//num := 1 + (lst1[1]).(int)
	//fmt.Println(num)
	//fmt.Println(lst1)
	////空接口默认类型为nil
	//
	//fmt.Printf("lst1[0]的类型是:%T \n",lst1[1])

	//
	//	flag := true
	//	var rand_num int
	//	stuname := []string{"方杰","鲁仁栋","史伟名","肖祥武","刘德华"}
	//	for flag {
	//		fmt.Println("按任意键开始")
	//		reader := bufio.NewReader(os.Stdin)
	//		num,_ := reader.ReadByte()
	//		if string(num) == "q" {
	//			break
	//		} else if len(stuname) == 0 {
	//			fmt.Println("用户已经全部抽取完成")
	//			break
	//		} else{
	//			if len(stuname) == 1{
	//				rand_num = 0
	//			} else {
	//				//时间戳	从1970年1月1日 到现在的秒数
	//				rand.Seed(time.Now().Unix())	//加入随机种子
	//				rand_num = rand.Intn(len(stuname) - 1)
	//			}
	//			fmt.Printf("请%s同学回答问题 \n", stuname[rand_num])
	//			stuname = append(stuname[:rand_num], stuname[rand_num+1:]...)
	//		}
	//	}
	//
	//}
}
//s1 := make([]int,5)